#include "InformacionCarreraFactory.h"

using namespace servicios;

InformacionCarreraFactory::InformacionCarreraFactory(void)
{
}

InformacionCarrera* InformacionCarreraFactory::Construir(InformacionCarreraYAML informacionCarreraYAML) 
{
	InformacionCarrera* informacionCarrera = new InformacionCarrera(informacionCarreraYAML.nombreCarrera);
	informacionCarrera->SetCreditosMateriasObligatorias(informacionCarreraYAML.creditosMateriasObligatorias);
	informacionCarrera->SetCreditosMateriasOptativas(informacionCarreraYAML.creditosMateriasOptativas);
	informacionCarrera->SetCantidadMateriasOptativasMinimas(informacionCarreraYAML.cantidadMateriasOptativas);
	informacionCarrera->SetCondicionesMateriasObligatorias(this->Construir(informacionCarreraYAML.informacionMateriasObligatorias));
	informacionCarrera->SetCondicionesMateriasOptativas(this->Construir(informacionCarreraYAML.informacionMateriasOptativas));
	return informacionCarrera;
};

list<InformacionMateriaSegunCarrera*> InformacionCarreraFactory::Construir(list<InformacionMateriaSegunCarreraYAML> informacionMateriasSegunCarreraYAML) 
{
	list<InformacionMateriaSegunCarrera*> informacionMateriasSegunCarrera;
	list<InformacionMateriaSegunCarreraYAML>::iterator itInformacionMaterias;
	for(itInformacionMaterias = informacionMateriasSegunCarreraYAML.begin(); 
		itInformacionMaterias != informacionMateriasSegunCarreraYAML.end(); itInformacionMaterias++)
	{
		InformacionMateriaSegunCarreraYAML informacionMatSegunCarreraYAML = *itInformacionMaterias;
		InformacionMateriaSegunCarrera* informacionMatSegunCarrera = new InformacionMateriaSegunCarrera();
		informacionMatSegunCarrera->SetCodigo(informacionMatSegunCarreraYAML.codigo);
		informacionMatSegunCarrera->SetCodigoCorrelativas(this->SplitConSeparador(informacionMatSegunCarreraYAML.correlativas, ','));
		informacionMatSegunCarrera->EsObligatoria(informacionMatSegunCarreraYAML.esObligatoria);
		informacionMateriasSegunCarrera.push_back(informacionMatSegunCarrera);
	}
	return informacionMateriasSegunCarrera;
};

list<string> InformacionCarreraFactory::SplitConSeparador(string streamCorrelativas, char separador)
{
	list<string> correlativas;
	size_t pos = 0;
	while(streamCorrelativas.substr(pos).find(separador) != string::npos)
	{
		correlativas.push_back(streamCorrelativas.substr(pos, streamCorrelativas.substr(pos).find(separador))); 
		pos += streamCorrelativas.substr(pos).find(separador) + 1; 
	}
	correlativas.push_back(streamCorrelativas.substr(pos));
	
	correlativas.remove("CBC");
	correlativas.remove("Ninguna");
	return correlativas;
};